home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
asmbler.arc
/
INSTALL.ASM
< prev
next >
Wrap
Assembly Source File
|
1988-11-19
|
7KB
|
383 lines
PAGE 55,132
TITLE QuadScreen INSTALL - Copyright 1983 Mathews Associates
SCRSEG EQU 0D000H ; HARDWARE SEGMENT FOR SCREEN
;
;
VECTORS SEGMENT AT 0
ORG 2*4
INT2IP DW ? ; Parity error / QuadScreen retrace interrupt
INT2CS DW ? ; vector - IP and CS
ORG 9*4
INT9IP DW ? ; Keyboard interrupt
INT9CS DW ?
ORG 16*4
INT16IP DW ? ; Video I/O IP and CS
INT16CS DW ?
VECTORS ENDS
DATA SEGMENT AT 00040H
ORG 017H
B17 DB ?
B18 DB ?
DATA ENDS
QS SEGMENT PUBLIC 'QS'
PUBLIC PLAST
EXTRN ALTINT:FAR,LAST:NEAR,RETRACE:NEAR
EXTRN OI16IP:WORD,OI16CS:WORD,HDWADR:WORD
ASSUME CS:QS,DS:QS
ORG 0100H
INSTALL PROC NEAR
XOR AX,AX ; Setup retrace vector
MOV ES,AX
ASSUME ES:VECTORS
; Get current Video I/O vector:
MOV AX,INT16IP
MOV OI16IP,AX
MOV AX,INT16CS
MOV OI16CS,AX
; Check if it is to SYSROM segment:
CMP AX,0F000H
JZ INST01 ; Yes, O.K.
; Print message & exit:
MOV DX,OFFSET MSG01
MOV AH,9
INT 21H ; Print message
INT 20H ; Exit back to DOS
;
INST01:
CLI
MOV AX,INT9IP
MOV KEYBDIP,AX
MOV AX,INT9CS
MOV KEYBDCS,AX
MOV AX,OFFSET RETRACE
MOV INT2IP,AX
MOV AX,OFFSET ALTINT
MOV INT16IP,AX
MOV AX,OFFSET KEYINT
MOV INT9IP,AX
MOV AX,CS
MOV INT2CS,AX
MOV INT16CS,AX
MOV INT9CS,AX
STI
ASSUME ES:NOTHING
MOV AH,0
MOV AL,008H
INT 16
MOV DX,PLAST
ADD DX,15
MOV CL,4
SHR DX,CL
MOV AH,031H
XOR AL,AL
INT 33
PLAST DW LAST
MSG01: DB 'QuadScreen has already been Installed !',13,10,'$'
INSTALL ENDP
KBD_INT PROC FAR
KEYINT:
STI
PUSH AX
PUSH DS
MOV AX,SEG DATA
MOV DS,AX
ASSUME DS:DATA
; IF SYSTEM RESET FROM KEYBOARD THEN RESET QUADSCREEN SCAN
; REGISTER TO 0, DISABLE QUADSCREEN INTERRUPT AND DISABLE
; VIDEO ON QUADSCREEN. (I.E., WRITE 0000H TO HARDWARE REGISTER
; AT PORT 220H & 221H.)
;
IN AL,060H
CMP AL,83 ; CHECK FOR DEL KEY
JNZ KYI1
TEST B17,4 ; CHECK FOR CTRL STATE
JZ KYI1
TEST B17,8 ; CHECK FOR ALT STATE
JZ KYI1
PUSH DX
XOR AX,AX
MOV DX,0220H
OUT DX,AX
POP DX
KYI1:
; CHECK FOR ALT-PRTSC KEY. IF YES, THEN PROCESS HERE BY GIVING
; A BIT-BY-BIT QUADSCREEN DUMP TO PRINTER.
;
CMP AL,55 ; CHECK FOR PRTSC KEY
JNZ KYI2
MOV AL,B17
AND AL,0FH
CMP AL,8 ; CHECK IF ALT IS ONLY SHIFT STATE
JNZ KYI2 ; IF NOT, JUMP TO PROCESS IN NORMAL WAY
PUSH BX ; SAVE ALL REGISTERS
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH ES
IN AL,061H ; READ CONTROL PORT
MOV AH,AL ; SAVE VALUE READ
OR AL,080H ; RESET BIT FOR KBD
OUT 061H,AL
XCHG AL,AH ; GET ORIGINAL CONTROL PORT VALUE
OUT 061H,AL ; KBD HAS BEEN RESET
CALL QSDUMP ; QUADSCREEN SCREEN DUMP
CLI ; INTERRUPT RETURN SEQUENCE
MOV AL,020H
OUT 020H,AL ; SEND END-OF-INTERRUPT COMMAND
POP ES
POP DI
POP SI
POP DX
POP CX
POP BX
POP DS
POP AX
IRET
;
KYI2:
POP DS
ASSUME DS:NOTHING
POP AX
JMP DWORD PTR CS:KEYBDIP
KEYBDIP DW ?
KEYBDCS DW ?
KBD_INT ENDP
ASSUME CS:QS,DS:QS,ES:QS
QSDUMP PROC
MOV AX,CS
MOV DS,AX ; INITIALIZE DATA & EXTENDED SEGMENTS
MOV ES,AX ; = CODE SEGMENT
;
QSD10:
MOV BL,27 ; CHAR SEQUENCE FOR 7/72" LINE SPACING
CALL PRTCHAR
MOV BL,49
CALL PRTCHAR
;
XOR DX,DX ; INITIALIZE ROW NO.
;
QSD20:
LEA SI,BUF
XOR CX,CX ; INITIALIZE COLUMN NO.
PUSH DX ; SAVE INITIAL ROW NO.
;
QSD30:
XOR BX,BX ; CLEAR BYTE TO BE PRINTED
;
QSD40:
SHL BL,1
CALL RD_DOT ; READ A SCREEN DOT
OR BL,AL ; PUT IT INTO BYTE TO PRINT
INC DX ; ADVANCE TO NEXT ROW
MOV AX,DX
AND AX,7 ; CHECK IF DONE WITH 8 ROWS
JNZ QSD40
;
MOV [SI],BL ; PUT BL IN PRINT-LINE BUFFER
INC SI ; ADVANCE TO NEXT SPOT IN BUFFER
INC CX ; ADVANCE TO NEXT COLUMN
CMP CX,968 ; SEE IF LAST COLUMN
JAE QSD50 ; JUMP WHEN FINISHED THE ROW
POP DX ; RESTORE INITIAL ROW NO.
PUSH DX
JMP QSD30 ; GO BACK TO PROCESS 8 ROWS OF NEXT COL
;
QSD50:
CALL PRT_BUF ; PRINT LINE BUFFER
POP DX
ADD DX,8
CMP DX,511 ; CHECK IF DONE WITH WHOLE SCREEN
JL QSD20 ; CONTINUE IF NOT DONE
MOV BL,27 ; RESET TO 1/8" LINE SPACING
CALL PRTCHAR
MOV BL,48
CALL PRTCHAR
RET ; TERMINATE PROGRAM
QSDUMP ENDP
;
;-------------------------------------------------------
;
BUF DB 968 DUP(0) ; PRINT-LINE BUFFER
BUF_END EQU $ ; END OF BUFFER +1
PRTSEL EQU 0 ; PRINTER SELECT (CAN BE 0,1 OR 2)
;
;-------------------------------------------------------
;
;
;
;
;
; PRINT BUFFER
;
PRT_BUF PROC
PUSH AX ; SAVE REGISTERS
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
;
; QUADSCREEN HAS 968 PIXELS IN ONE DOT ROW BUT THE EPSON MX-80
; HAS ONLY 960 PIXELS. THE FOLLOWING LOOP OR'S THE LAST 9 SCREEN
; PIXELS IN THE PRINT BUFFER. WHILE THE APPEARANCE OF THIS ON
; THE PRINTER MAY BE QUESTIONABLE, THE ATTEMPT IS TO KEEP FROM
; LOSING ANY SCREEN INFORMATION.
;
LEA DI,BUF_END
MOV CX,9 ; CX = LOOP COUNT
XOR BX,BX ; INITIALIZE COMPOSITE BYTE = 0
;
PB10:
DEC DI
OR BL,[DI] ; OR IN NEXT BYTE
LOOP PB10
MOV [DI],BL ; PUT COMPOSITE BYTE BACK AS 960th BYTE
MOV CX,960 ; CX = NO. OF BYTES IN BUFFER TO PRINT
; THE FOLLOWING LOOP SCANS THE PRINT-LINE BUFFER FROM END BACK
; TO BEGINNING. THE LOOP STOPS AT THE FIRST NON-ZERO BYTE OR AT
; THE BEGINNING OF THE BUFFER, WHICHEVER COMES FIRST. THIS IS
; TO STREAMLINE THE PRINT SO THAT ONLY THE MINIMUM NO. OF BYTES
; ARE SENT TO THE PRINTER FOR EACH PRINT LINE.
;
PB20:
MOV AL,[DI]
CMP AL,0
JNZ PB30
DEC DI
LOOP PB20
;
PB30:
JCXZ PB50 ; IF ALL BYTES WERE 0, DON'T PRINT ANY
MOV BL,27 ; CHAR SEQUENCE FOR PRINTER
CALL PRTCHAR ; < DUAL-DENSITY BIT IMAGE MODE >
MOV BL,76
CALL PRTCHAR
MOV BL,CL
CALL PRTCHAR
MOV BL,CH
CALL PRTCHAR
XOR SI,SI
;
PB40:
MOV BL,[SI+BUF]
CALL PRTCHAR
INC SI
LOOP PB40
;
PB50:
MOV BL,10
CALL PRTCHAR
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
PRT_BUF ENDP
;
;
;
;
;
; PRINT A CHAR IN BL
;
;
;
PRTCHAR PROC
PUSH AX
PUSH DX
;
PC10:
XOR AX,AX
MOV AH,2
MOV DX,PRTSEL
INT 23 ; FETCH PRINTER STATUS
TEST AL,80H ; CHECK IF BUSY
JNZ PC10 ; LOOP AND WAIT TILL NOT BUSY
XOR AH,AH
MOV AL,BL
INT 23 ; PRINT A CHARACTER
POP DX
POP AX
RET
PRTCHAR ENDP
;
;
;
; READ A SCREEN DOT
;
RD_DOT PROC
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV DI,CX
MOV BX,CX
MOV CL,3
ADD DX,HDWADR
AND DX,03FFH
SHL DX,CL
ADD DX,SCRSEG
MOV ES,DX
SHR DI,CL
AND BX,7
MOV AH,1
MOV CL,7
SUB CL,BL
SHL AH,CL
XOR AL,AL
TEST ES:[DI],AH
JZ RD10
INC AL
;
RD10:
POP SI
POP DX
POP CX
POP BX
RET
RD_DOT ENDP
;
;
QS ENDS
;
END INSTALL